<?php

/**
 * Функция возвращает значение переменной variable, в случая если переменная определена.
 * Если переменная не определена, функция вернёт значение, указанное в переменнной default.
 * 
 * @param  mixed $variable  Проверяемая переменная
 * @param  mixed $default   Возвращаемое значение, если переменная $variable не определена.
 * @return mixed            Функция возвратит либо $variable, либо $default   
 */
function ifsetor(&$variable, $default = '') {
	if (isset($variable)) {
		return $variable;
	} else {
		return $default;
	}
}


/**
 * Функция возвращает TRUE, если проверяемая переменная определена и равна значению
 * переменной valueForChecking. Если одно из этих условий не выполнено -
 * функция вернёт FALSE.
 * 
 * @param  mixed $variable           Проверяемая переменная
 * @param  mixed $valueForChecking   Значение, которое будет сравниваться с проверяемой переменной
 * @return bool                      
 */
function ifSetAndEquals(&$variable, $valueForChecking) {
    // Проверка переменной variable
    if (isset($variable) && ($variable == $valueForChecking)) {
        return true;
    } else {
        return false;
    }
}


/**
 * Функция возвращает массив с тестом и цветовый кодом. Результат функции используется при выводе
 * статуса рассмотрения запроса для вывода текста и раскраски поля таблицы.
 * 
 * @param  integer $statusCode  Код статуса (константы статуса находятся в файле constans.inc.php)
 * @return array                Элемент text будет содержать текст; элемент color будет содержать цветовой код
 */
function getRequestStatus($statusCode) {
    $queryStatus = array();
    switch ($statusCode) {
        // Запрос по умолчанию; нерассмотренный запрос
        case INV_REQ_STANDART:
            $queryStatus['text']  = 'Рассматривается';
            $queryStatus['color'] = '#feff8f';
            break;
        // Принятый запрос [Одобрено]
        case INV_REQ_OK:
            $queryStatus['text']  = 'Одобрен';
            $queryStatus['color'] = '#8fff97';
            break;
        // Отклонённый запрос [Отказано]
        case INV_REQ_DENIED:
            $queryStatus['text']  = 'Отказано';
            $queryStatus['color'] = '#ff8f8f';
            break;
        // Специальный статуст для уже проверенных запросов, но по которым нет
        // окончательного решения
        case INV_REQ_MAYBE:
            $queryStatus['text']  = 'Запрос рассмотрен, но результат пока что неизвестен';
            $queryStatus['color'] = '#d6ff8f';
            break;
        // Неизвестный статус запроса; для вывода в случае сбоя скрипта
        default:
            $queryStatus['text']  = 'Неизвестен';
            $queryStatus['color'] = '#dedede';
            break; 
    }
    // Возвращаем массив:
    // $queryStatus['text']  - текст статуса
    // $queryStatus['color'] - цвет строки таблицы
    return $queryStatus;
}


/**
 * Функция проверяет массив $array на наличие элементов из массива $elements
 * Если массив $array содержит всё элементы, указанные в массиве $elements, то функция
 * вернёт TRUE, иначе функция вернёт FALSE
 * 
 * @param  array $array     Исходный массив
 * @param  array $elements  Массив с элементами, которые нужно проверить
 * @return bool             Возвратит TRUE, если все элементы присутствуеют, иначе возвратит FALSE
 */
function issetArray(&$array, $elements) {
    // Парсим массив $array
    foreach ($elements as $element) {
        // Проверяем элемент
        if (! isset($array[$element])) {
            // Если такой элемент отсутствует, возращаем FALSE
            return false;
        }
    }
    // Если все элементы содержатся - возвращаем TRUE
    return true;
}


/**
 * Функция возвращает слово "инвайт" в родительном падеже
 * 
 * @param  integer $inviteCount  Количество инвайтов
 * @return string                Слово "инвайт" в родительном падеже
 */
function validInvite($inviteCount) {
    $inviteCount = (string)$inviteCount;
    // Если количество символов в числе больше одного и второе число с конца равно единице
    if ((strlen($inviteCount) > 1) && (substr($inviteCount, -2, 1)) == 1) {
        return 'инвайтов';
    } else {
        // Получаем последнюю цифру из числа
        $lastNumber = substr($inviteCount, -1);
        // Если последнее число - единица
        if ($lastNumber == 1) {
            return 'инвайт';
            // Если последнее число больше единицы и меньше пяти
        } elseif (($lastNumber) > 1 && ($lastNumber) < 5) {
            return 'инвайта';
        // Если последнее число больше четырёх, либо ноль
        } else {
            return 'инвайтов';
        }
    }
}


/**
 * Функция принимает в качестве параметра строку $string, и проверяет её на наличие латинских
 * символов и цифр. Если функция содержит только эти символы, функция вернёт TRUE, иначе FALSE.
 * 
 * @param  string $string  Проверяемая строка
 * @return bool			   Результат проверки строки
 */
function checkWord($string) {
    return !preg_match('/[^a-zA-Z0-9]/', $string);
}


/**
 * Функция проверяет E-Mail адрес на правильность (исп. регулярное выражение)
 * 
 * @param  string $mail  Проверяемый E-Mail адрес
 * @return bool			 Результат проверки строки
 */
function checkMail($mail) {
    // Регулярка для проверки мыла
    $regExp  = '/([a-z0-9])([-a-z0-9._])+([a-z0-9])\@([a-z0-9])([-a-z0-9_])';
    $regExp .= '+([a-z0-9])(\.([a-z0-9])([-a-z0-9_-])([a-z0-9])+)*/i';
    return preg_match($regExp, $mail);
}


/**
 * Функция проверяет числовое значение на принадлежность к определённому интервалу 
 * 
 * @param  integer $value  Значение для проверки
 * @param  integer $min    Минимальное значение числа
 * @param  integer $max    Максимальное значение числа
 * @return bool            Резуьтат проверки
 */
function checkValue($value, $min, $max) {
    if (! is_numeric($value) || $value < $min || $value > $max) {
        return false;
    } else {
        return true;
	}
}


/**
 * Функция проверяет длину указанной строки на принадлежность к определённому интервалу
 * 
 * @param  string  $string  Строка для проверки
 * @param  integer $min     Минимально допустимое количество символов
 * @param  integer $max     Максимально допустимое количество символов
 * @return bool             Результат проверки
 */
function checkStringLenght($string, $min, $max) {
    if ((strlen($string) < $min) || (strlen($string) > $max)) {
        return false;
    } else {
        return true;
    }
}


/**
 * Функция преобразовывает IP-адрес текущего пользователя в Long Int число
 * 
 * @return integer  IP адрес в виде Long Int
 */
function currentIp2long() {
    return ip2long($_SERVER['REMOTE_ADDR']);
}


/**
 * Функция выполняет обратное преобразование IP адреса текущего
 * пользователя из Long Int в IP
 * 
 * @return integer  IP адрес в стандартном виде
 */
function currentLong2ip() {
    return long2ip($_SERVER['REMOTE_ADDR']);
}


function diefooter($text) {
    echo $text;
    require_once (TPL_DIR . 'footer.php');
    die();
}


function cropString($string, $maxChars) {
    if (mb_strlen($string) >= $maxChars) {
        $string = mb_substr($string, 0, $maxChars, 'UTF-8') . '...';
    }
    return $string;
}